package mybatis.mapper;

import mybatis.Utill.batisUtill;
import mybatis.pojo.Emp;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;

import mybatis.Utill.*;
import org.junit.Test;

public class EmpMapper {
    public Emp selectEmpInfoByEmpno(int empno) {
        //mybatis的使用步骤
//        //1.通过配置文件获取SqlSessionFactory对象 即Sql会话工厂对象
//        String resource = "mybatisConfugration.xml";
//        //将配置文件写成数据流并获取
//        InputStream stream = Resources.getResourceAsStream(resource);
//        //获取工厂创建器并根据配置文件的数据流创建出工厂实例化对象
//        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);
//        //2.获取SqlSession对象，ss对象是mybatis的核心对象，大部分功能性的api都集成于该对象
//        SqlSession sqlSession = sqlSessionFactory.openSession(); //openSession()方法也可以接受一个boolean类型的参数，为true时表示自动提交事务
        //3.使用对象调用执行器(executor 即api接口)实现数据库操作
//        batisUtill.getSession().selectOne("EmpMapper.selectEmpInfoByEmpno",10);
        //查询指令有select() selectList/Map/One()，list返回list集合，Map返回map集合 one返回单一指定结果
        //4.提交事务 commit()方法可以接受一个boolean参数用于表示是否强制提交事务(通常执行对数据库造成改变的语句时才提交事务 表示“确认更改”)，非强制时没有增删改操作不会提交事务，强制时不管有无增删改操作都会提交事务
//        sqlSession.commit();
        //5.释放资源
//        sqlSession.close();
        return batisUtill.getSession().selectOne("mybatis.mybatisMapper.EmpMapper.selectEmpInfoByEmpno",10);
    }

    public List<Emp> selectAll() {
        return batisUtill.getSession().selectList("mybatis.mybatisMapper.EmpMapper.selectAll");
    }

    public int addEmpInfo(Emp emp){
        return batisUtill.getSession().insert("mybatis.mybatisMapper.EmpMapper.addEmpInfo",emp);
    }
    public int delEmpInfo(int empno) throws IOException{
        return batisUtill.getSession().delete("mybatis.mybatisMapper.EmpMapper.delEmpInfo",empno);
    }
    public int updateEmpEname(HashMap<String,Object> map) throws IOException{
        return batisUtill.getSession().update("mybatis.mybatisMapper.EmpMapper.updateEmpEname",map);
    }
    public List<HashMap<String, Object>> selectEmpByED(String ename, int deptno) {
        return null;
    }

    /*    JUnit 全称java单元测试框架
        用于编写和运行自动化测试，该框架提供了一系列的功能性注解和断言方法，使测试代码的运行和维护更加简便，不再需要额外声明一个main主方法来进行测试
        JUnit4支持多个测试用例的组织和执行，能自动运行并检查结果，提供即时反馈
        JUnit4的特点
        1.容易使用：JUnit4提供了简洁API
        2.自动化测试：测试用例可以自动运行并检查结果，提供即时反馈
        3.丰富的断言方法：用于比较实际结果和预期结果，确保测试准确性
        4.可扩展性：JUnit4可以组织测试用例为一个套件或者说整体来进行有顺序的执行动作和套件测试，提高了测试灵活性和可维护性
     */
//@Test 注解，用于标明该方法属于测试方法，测试方法的开头通常要以test开头，单元测试类必须继承自TestCase
//Test方法不能带有参数且没有返回值，带参注解(@ParameterizedTest)在junit5才引入，junit4没有此注解，无法使用带参测试方法
    @Test
    public void testMethod() throws IOException {
//        调用映射文件中的方法进行sql操作有两种方式
//        第一种是用SqlSession的API直接调用映射文件的方法获取数据库信息
        EmpMapper empMapper = new EmpMapper();
        System.out.println(empMapper.selectEmpInfoByEmpno(10));
        System.out.println(empMapper.selectAll());
        //如果填入方法中的pojo对象参数不够，比如说对象的构造函数只有两个参数，而sql语句要求三个参数，则最终填入表中的的除了这两个参数对应的空以外，其他都会为构造函数的默认值(对象的全局变量会自动初始化所以最终填进数据库的是默认值)
        System.out.println("受影响行数(insert):"+empMapper.addEmpInfo(new Emp("josda","123456","不吉祥物",100,100,"2025-1-8",30)));
        System.out.println("受影响行数(delete):"+empMapper.delEmpInfo(14));
        HashMap<String,Object> map = new HashMap<>();
        map.put("ename","汤玛丽");
        map.put("empno",1);
        System.out.println("受影响行数(update):"+empMapper.updateEmpEname(map));
//        第二种是基于接口进行操作 通过SqlSession的API创建与interface接口对应的代理对象即可
//        代理对象：SqlSession临时创建一个对象用来实现接口的方法再将映射文件中的sql语句映射到临时对象中对应的方法中 该临时对象就叫做代理对象
        mybatis.mybatisMapper.EmpMapper interfaceEmpMapper = batisUtill.getSession().getMapper(mybatis.mybatisMapper.EmpMapper.class);
        System.out.println("基于接口进行数据库查询操作：\n"+interfaceEmpMapper.selectAll());
//        System.out.println("基于接口进行数据库插入操作：\n"+interfaceEmpMapper.addEmpInfo(new Emp("yobai","123456","吉祥物",100,100,"2025-1-8",30)));
        //Scanner sc = new Scanner(System.in); //junit4不支持用Scanner获取键盘输入的信息，因为它模拟的是自动化环境的测试运行，所以不太重视人机交互，如果想要用就只能改idea的配置或者用main方法
        System.out.println(interfaceEmpMapper.selectEmpByED("汤玛丽",10));
    }
}
